package main

import "fmt"

func main() {
	ch := make(chan int)
	go test(ch)

	for {
		val, ok := <-ch
		if ok == false { // ok 为 false，没有数据可读
			fmt.Println("channel closed!")
			break // 跳出循环
		}
		fmt.Println("get val: ", val)
	}
}

// ch为普通通道，可以向通道发送数据，也可以从通道接收数据
func test(ch chan int) {
	for i := 0; i < 5; i++ {
		ch <- i
	}
	// 关闭通道的作用是：告诉通道接收方，已经没有更多的值会被发送到通道中了，而且接收方可以通过通道的接收操作，获知通道已关闭
	// 关闭一个已关闭的通道或者关闭一个为 nil 的通道都会导致 panic
	// 关闭通道的一般原则是：只有发送方才能关闭通道，而不是接收方。（通常情况下，不需要关闭一个已经不再使用的通道，因为 Go 语言的垃圾回收机制会自动回收通道资源）
	close(ch)
}

// ch为单向通道，只能向通道发送数据，不能从通道接收数据
func test2(ch chan<- int) {
	for i := 0; i < 5; i++ {
		ch <- i
	}

	close(ch)
}
